package cn.zzq.aix.nativeinterface.javareflector.parser;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.function.Consumer;

import cn.zzq.aix.nativeinterface.javareflector.ReflectException;
import cn.zzq.aix.nativeinterface.javareflector.ReflectUtil;
import cn.zzq.aix.nativeinterface.javareflector.ReflectUtil.MethodFilter;

public class ModifiesParser extends ArrayList<String> {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * 根据修饰符代码获取所有的修饰符文本
	 * 
	 * @param mod
	 */
	private void addModifies(int mod) {
		// 过滤并执行Modifier类中的所有is打头的判断修饰符的方法，并且如果判定成立则添加至本修饰符集合
		ReflectUtil.getFilteredMethods(Arrays.asList(Modifier.class.getMethods()), new MethodFilter() {

			@Override
			public boolean accept(Method method) {
				return method.getName().startsWith("is");
			}
		}).forEach(new Consumer<Method>() {

			@Override
			public void accept(Method method) {
				try {
					if ((boolean) method.invoke(null, mod)) {
						add(method.getName().substring(2).toLowerCase());
					}

				} catch (Exception e) {
				}
			}
		});

	}

	public ModifiesParser(Object modifiable) {
		try {
			Method method = modifiable.getClass().getMethod("getModifiers");
			try {
				addModifies((int) method.invoke(modifiable));
			} catch (Exception e) {
			}
		} catch (NoSuchMethodException e) {
			throw new ReflectException(modifiable, "ModifiesParser", "获取修饰符操作只能应用于方法，字段，类或方法参数对象");
		}
	}

}
